home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 2.iso / dist / fw_guile.idb / usr / freeware / include / libguile / goops.h.z / goops.h
Encoding:
C/C++ Source or Header  |  2002-07-08  |  11.7 KB  |  302 lines

  1. /* classes: h_files */
  2.  
  3. #ifndef SCM_GOOPS_H
  4. #define SCM_GOOPS_H
  5. /* Copyright (C) 1998,1999,2000,2001 Free Software Foundation, Inc.
  6.  * 
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2, or (at your option)
  10.  * any later version.
  11.  * 
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  * 
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this software; see the file COPYING.  If not, write to
  19.  * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  20.  * Boston, MA 02111-1307 USA
  21.  *
  22.  * As a special exception, the Free Software Foundation gives permission
  23.  * for additional uses of the text contained in its release of GUILE.
  24.  *
  25.  * The exception is that, if you link the GUILE library with other files
  26.  * to produce an executable, this does not by itself cause the
  27.  * resulting executable to be covered by the GNU General Public License.
  28.  * Your use of that executable is in no way restricted on account of
  29.  * linking the GUILE library code into it.
  30.  *
  31.  * This exception does not however invalidate any other reasons why
  32.  * the executable file might be covered by the GNU General Public License.
  33.  *
  34.  * This exception applies only to the code released by the
  35.  * Free Software Foundation under the name GUILE.  If you copy
  36.  * code from other Free Software Foundation releases into a copy of
  37.  * GUILE, as the General Public License permits, the exception does
  38.  * not apply to the code that you add in this way.  To avoid misleading
  39.  * anyone as to the status of such modified files, you must delete
  40.  * this exception notice from them.
  41.  *
  42.  * If you write modifications of your own for GUILE, it is your choice
  43.  * whether to permit this exception to apply to your modifications.
  44.  * If you do not wish that, delete this exception notice.  */
  45.  
  46.  
  47. /* This software is a derivative work of other copyrighted softwares; the
  48.  * copyright notices of these softwares are placed in the file COPYRIGHTS
  49.  *
  50.  * This file is based upon stklos.h from the STk distribution by
  51.  * Erick Gallesio <eg@unice.fr>.
  52.  */
  53.  
  54. #include "libguile/__scm.h"
  55.  
  56. #include "libguile/validate.h"
  57.  
  58. /*
  59.  * scm_class_class
  60.  */
  61.  
  62. #define SCM_CLASS_CLASS_LAYOUT "pruosrpwpopopwururururururururpwpwpwpwpwpwpwpwpwpwpwpw"
  63.  
  64. #define scm_si_layout          0 /* the struct layout */
  65. #define scm_si_vcell          1 
  66. #define scm_si_vtable          2 
  67. #define scm_si_print          3 /* the struct print closure */
  68. #define scm_si_proc          4
  69. #define scm_si_setter          5 
  70.  
  71. #define scm_si_goops_fields      6
  72.  
  73. /* Defined in libguile/objects.c:
  74. #define scm_si_redefined      6    The class to which class was redefined.
  75. #define scm_si_hashsets           7
  76. */
  77. #define scm_si_name          15 /* a symbol */
  78. #define scm_si_direct_supers      16 /* (class ...) */
  79. #define scm_si_direct_slots     17 /* ((name . options) ...) */
  80. #define scm_si_direct_subclasses 18 /* (class ...) */
  81. #define scm_si_direct_methods     19 /* (methods ...) */
  82. #define scm_si_cpl         20 /* (class ...) */
  83. #define scm_si_slotdef_class     21 
  84. #define scm_si_slots         22 /* ((name . options) ...) */
  85. #define scm_si_name_access     23 
  86. #define scm_si_keyword_access     24 
  87. #define scm_si_nfields         25 /* an integer */
  88. #define scm_si_environment     26 /* The environment in which class is built  */
  89. #define SCM_N_CLASS_SLOTS     27
  90.  
  91. typedef struct scm_t_method {
  92.   SCM generic_function;
  93.   SCM specializers;
  94.   SCM procedure;
  95. } scm_t_method;
  96.  
  97. #define SCM_METHOD(obj) ((scm_t_method *) SCM_STRUCT_DATA (obj))
  98.  
  99. #define SCM_CLASSF_SIMPLE_METHOD    (0x004 << 20)
  100. #define SCM_CLASSF_ACCESSOR_METHOD  (0x008 << 20)
  101.  
  102. /* Defined in libguile/objects.c */
  103. /* #define SCM_CLASSF_PURE_GENERIC  (0x010 << 20) */
  104.  
  105. #define SCM_CLASSF_FOREIGN        (0x020 << 20)
  106. #define SCM_CLASSF_METACLASS        (0x040 << 20)
  107.  
  108. /* Defined in libguile/objects.c */
  109. /* #define SCM_CLASSF_GOOPS_VALID   (0x080 << 20) */
  110. /* #define SCM_CLASSF_GOOPS         (0x100 << 20) */
  111. #define SCM_CLASSF_GOOPS_OR_VALID (SCM_CLASSF_GOOPS | SCM_CLASSF_GOOPS_VALID)
  112.  
  113. #define SCM_CLASSF_INHERIT     (~(SCM_CLASSF_PURE_GENERIC \
  114.                     | SCM_CLASSF_SIMPLE_METHOD \
  115.                     | SCM_CLASSF_ACCESSOR_METHOD \
  116.                     | SCM_STRUCTF_LIGHT) \
  117.                   & SCM_CLASSF_MASK)
  118.  
  119. #define SCM_INST(x)           SCM_STRUCT_DATA (x)
  120.  
  121. /* Also defined in libguile/objects.c */
  122. #define SCM_CLASS_OF(x)        SCM_STRUCT_VTABLE (x)
  123. #define SCM_ACCESSORS_OF(x)    (SCM_PACK (SCM_STRUCT_VTABLE_DATA (x)[scm_si_getters_n_setters]))
  124. #define SCM_NUMBER_OF_SLOTS(x) \
  125.  (SCM_UNPACK (SCM_STRUCT_DATA (x)[scm_struct_i_n_words]) \
  126.   - scm_struct_n_extra_words)
  127.  
  128. #define SCM_CLASSP(x) \
  129.   (SCM_STRUCTP (x) && SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_METACLASS)
  130. #define SCM_VALIDATE_CLASS(pos, x) SCM_MAKE_VALIDATE (pos, x, CLASSP)
  131.  
  132. #define SCM_INSTANCEP(x) \
  133.   (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_GOOPS))
  134. #define SCM_VALIDATE_INSTANCE(pos, x) SCM_MAKE_VALIDATE (pos, x, INSTANCEP)
  135.  
  136. #define SCM_PUREGENERICP(x) \
  137.   (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_PURE_GENERIC))
  138. #define SCM_VALIDATE_PUREGENERIC(pos, x) SCM_MAKE_VALIDATE (pos, x, PUREGENERICP)
  139.  
  140. #define SCM_ACCESSORP(x) \
  141.   (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_ACCESSOR_METHOD))
  142. #define SCM_VALIDATE_ACCESSOR(pos, x) SCM_MAKE_VALIDATE (pos, x, ACCESSORP)
  143.  
  144. #define SCM_SLOT(x, i)         (SCM_PACK (SCM_INST (x) [i]))
  145. #define SCM_SET_SLOT(x, i, v)  (SCM_INST (x) [i] = SCM_UNPACK (v))
  146. #define SCM_SET_HASHSET(c, i, h)  (SCM_INST (c) [scm_si_hashsets + (i)] = (h))
  147.  
  148. #define SCM_SUBCLASSP(c1, c2)  (!SCM_FALSEP (scm_c_memq (c2, SCM_SLOT (c1, scm_si_cpl))))
  149. #define SCM_IS_A_P(x, c) \
  150.   (SCM_INSTANCEP (x) && SCM_SUBCLASSP (SCM_CLASS_OF (x), c))
  151.  
  152. #define SCM_GENERICP(x) \
  153.   (SCM_INSTANCEP (x) && SCM_SUBCLASSP (SCM_CLASS_OF (x), scm_class_generic))
  154. #define SCM_VALIDATE_GENERIC(pos, x) SCM_MAKE_VALIDATE (pos, x, GENERICP)
  155.  
  156. #define SCM_METHODP(x) \
  157.   (SCM_INSTANCEP (x) && SCM_SUBCLASSP (SCM_CLASS_OF (x), scm_class_method))
  158. #define SCM_VALIDATE_METHOD(pos, x) SCM_MAKE_VALIDATE (pos, x, METHODP)
  159.  
  160. #define SCM_MCACHE_N_SPECIALIZED(C) SCM_CADDR (C)
  161. #define SCM_SET_MCACHE_N_SPECIALIZED(C, X) SCM_SETCAR (SCM_CDDR (C), X)
  162.  
  163. #define SCM_INITIAL_MCACHE_SIZE      1
  164.  
  165. #define scm_si_getters_n_setters scm_si_name_access
  166.  
  167. #define scm_si_constructor     SCM_N_CLASS_SLOTS
  168. #define scm_si_destructor     SCM_N_CLASS_SLOTS + 1
  169.  
  170. #define scm_si_methods         0  /* offset of methods slot in a <generic> */
  171. #define scm_si_n_specialized     1
  172. #define scm_si_used_by         2
  173. #define scm_si_cache_mutex     3
  174.  
  175. #define scm_si_generic_function     0  /* offset of gf    slot in a <method> */
  176. #define scm_si_specializers     1  /* offset of spec. slot in a <method> */
  177.  
  178. #define scm_si_procedure      2  /* offset of proc. slot in a <method> */
  179. #define scm_si_code_table     3  /* offset of code. slot in a <method> */
  180.  
  181. /* C interface */
  182. extern SCM scm_class_top, scm_class_object, scm_class_class;
  183. extern SCM scm_class_entity, scm_class_entity_with_setter;
  184. extern SCM scm_class_generic, scm_class_generic_with_setter, scm_class_method;
  185. extern SCM scm_class_simple_method, scm_class_accessor;
  186. extern SCM scm_class_procedure_class;
  187. extern SCM scm_class_operator_class, scm_class_operator_with_setter_class;
  188. extern SCM scm_class_entity_class;
  189. extern SCM scm_class_number, scm_class_list;
  190. extern SCM scm_class_keyword;
  191. extern SCM scm_class_port, scm_class_input_output_port;
  192. extern SCM scm_class_input_port, scm_class_output_port;
  193. extern SCM scm_class_foreign_class, scm_class_foreign_object;
  194. extern SCM scm_class_foreign_slot;
  195. extern SCM scm_class_self, scm_class_protected;
  196. extern SCM scm_class_opaque, scm_class_read_only;
  197. extern SCM scm_class_protected_opaque, scm_class_protected_read_only;
  198. extern SCM scm_class_scm;
  199. extern SCM scm_class_int, scm_class_float, scm_class_double;
  200. extern const char *scm_s_slot_set_x;
  201.  
  202. extern SCM scm_module_goops;
  203.  
  204. SCM scm_goops_version (void);
  205. SCM scm_oldfmt (SCM);
  206. char *scm_c_oldfmt0 (char *);
  207. char *scm_c_oldfmt (char *, int n);
  208. void scm_load_goops (void);
  209. SCM scm_make_foreign_object (SCM cls, SCM initargs);
  210. SCM scm_make_class (SCM meta, char *s_name, SCM supers, size_t size,
  211.             void * (*constructor) (SCM initargs),
  212.             size_t (*destructor) (void *));
  213. void scm_add_slot (SCM c, char *slot, SCM slot_class,
  214.            SCM (*getter) (SCM obj),
  215.            SCM (*setter) (SCM obj, SCM x),
  216.            char *accessor_name);
  217. SCM scm_wrap_object (SCM c, void *);
  218. SCM scm_wrap_component (SCM c, SCM obj, void *);
  219. SCM scm_ensure_accessor (SCM name);
  220. void scm_add_method (SCM gf, SCM m);
  221.  
  222. /* Low level functions exported */
  223. SCM scm_make_next_method (SCM methods, SCM args, SCM gf);
  224. SCM scm_basic_basic_make_class (SCM c, SCM name, SCM dsupers, SCM dslots);
  225. SCM scm_basic_make_class (SCM c, SCM name, SCM dsupers, SCM dslots);
  226.  
  227. /* Primitives exported */
  228. SCM scm_sys_allocate_instance (SCM c, SCM initargs);
  229. SCM scm_sys_set_object_setter_x (SCM obj, SCM setter);
  230. SCM scm_slot_ref (SCM obj, SCM slot_name);
  231. SCM scm_slot_set_x (SCM obj, SCM slot_name, SCM value);
  232.  
  233. SCM scm_compute_applicable_methods (SCM gf, SCM args, long len, int scm_find_method);
  234. SCM scm_sys_compute_applicable_methods (SCM gf, SCM args);
  235. SCM scm_m_atslot_ref (SCM xorig, SCM env);
  236. SCM scm_m_atslot_set_x (SCM xorig, SCM env);
  237. SCM scm_m_atdispatch (SCM xorig, SCM env);
  238. #ifdef GUILE_DEBUG
  239. SCM scm_pure_generic_p (SCM obj);
  240. #endif
  241.  
  242. SCM scm_sys_compute_slots (SCM c); 
  243. SCM scm_i_get_keyword (SCM key, SCM l, long len, SCM default_value, const char *subr); 
  244. SCM scm_get_keyword (SCM key, SCM l, SCM default_value); 
  245. SCM scm_sys_initialize_object (SCM obj, SCM initargs); 
  246. SCM scm_sys_prep_layout_x (SCM c); 
  247. SCM scm_sys_inherit_magic_x (SCM c, SCM dsupers); 
  248. SCM scm_instance_p (SCM obj); 
  249. SCM scm_class_name (SCM obj); 
  250. SCM scm_class_direct_supers (SCM obj); 
  251. SCM scm_class_direct_slots (SCM obj); 
  252. SCM scm_class_direct_subclasses (SCM obj); 
  253. SCM scm_class_direct_methods (SCM obj); 
  254. SCM scm_class_precedence_list (SCM obj); 
  255. SCM scm_class_slots (SCM obj); 
  256. SCM scm_class_environment (SCM obj); 
  257. SCM scm_generic_function_name (SCM obj); 
  258. SCM scm_generic_function_methods (SCM obj); 
  259. SCM scm_method_generic_function (SCM obj); 
  260. SCM scm_method_specializers (SCM obj); 
  261. SCM scm_method_procedure (SCM obj); 
  262. SCM scm_accessor_method_slot_definition (SCM obj);
  263. SCM scm_sys_tag_body (SCM body);
  264. SCM scm_sys_fast_slot_ref (SCM obj, SCM index); 
  265. SCM scm_sys_fast_slot_set_x (SCM obj, SCM index, SCM value); 
  266. SCM scm_slot_ref_using_class (SCM cls, SCM obj, SCM slot_name); 
  267. SCM scm_slot_set_using_class_x (SCM cls, SCM obj, SCM slot_name, SCM value); 
  268. SCM scm_slot_bound_using_class_p (SCM cls, SCM obj, SCM slot_name); 
  269. SCM scm_slot_exists_using_class_p (SCM cls, SCM obj, SCM slot_name); 
  270. SCM scm_slot_bound_p (SCM obj, SCM slot_name); 
  271. SCM scm_slots_exists_p (SCM obj, SCM slot_name); 
  272. SCM scm_sys_modify_instance (SCM old, SCM newinst); 
  273. SCM scm_sys_modify_class (SCM old, SCM newcls);
  274. SCM scm_sys_invalidate_class (SCM cls);
  275. SCM scm_make_method_cache (SCM gf);
  276. SCM scm_sys_invalidate_method_cache_x (SCM gf);
  277. SCM scm_generic_capability_p (SCM proc);
  278. SCM scm_enable_primitive_generic_x (SCM subrs);
  279. SCM scm_primitive_generic_generic (SCM subr);
  280. SCM stklos_version (void); 
  281. SCM scm_make (SCM args); 
  282. SCM scm_find_method (SCM args); 
  283. SCM scm_sys_method_more_specific_p (SCM m1, SCM m2, SCM targs); 
  284.  
  285. SCM scm_init_goops_builtins (void);
  286. void scm_init_goops (void); 
  287.  
  288. #if (SCM_DEBUG_DEPRECATED == 0)
  289.  
  290. #define SCM_INST_TYPE(x)       SCM_OBJ_CLASS_FLAGS (x)
  291. #define SCM_SIMPLEMETHODP(x) \
  292.   (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_SIMPLE_METHOD))
  293. #define SCM_FASTMETHODP(x) \
  294.   (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) \
  295.                        & (SCM_CLASSF_ACCESSOR_METHOD \
  296.               | SCM_CLASSF_SIMPLE_METHOD)))
  297.  
  298.  
  299. #endif
  300.  
  301. #endif /* SCM_GOOPS_H */
  302.